//
//  TLObservableObjectViewController.swift
//  TLiOS26LiquidGlassDemo
//
//  Created by jiayin on 2025/7/11.
//

import UIKit

/**
 新技术功能介绍：
 1.UIKit 支持@Observable类型。
 2.修饰的类型必须是类而不能是结构体。
 3.当其中的数据（属性值）发生更改时，相应的 UI 能够自动更新，而无需手动调用setNeedsLayout()、setNeedsDisplay()、layoutIfNeeded()等方法。
 4.需要将 UI 更新的代码放在 UIView 的layoutSubviews()或者 UIViewController 的viewWillLayoutSubviews()方法中。当@Observable中的数据发生变化时，layoutSubviews()与viewWillLayoutSubviews()方法会自动调用。
 5.该功能可以支持到 iOS 18，但需要在 Info.plist 文件中增加字段UIObservationTrackingEnabled，并且将其值设置为YES。
 */
class TLObservableObjectViewController: UIViewController {

    lazy var tableView: UITableView = {
        let tableView = UITableView(frame: UIScreen.main.bounds, style: .plain)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.rowHeight = UIScreen.main.bounds.height
        tableView.isPagingEnabled = true
        tableView.register(TLObservableObjectViewCell.self, forCellReuseIdentifier: "custom")
        return tableView
    }()

    let phoneModels = TLPhoneModel.getPhone()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        view.addSubview(tableView)
        
        // 模拟数据更新
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            if let firstModel = self.phoneModels.first {
                firstModel.name = "iPhone 17"
                firstModel.osName = "iOS 26"
            }
        }
    }

}

extension TLObservableObjectViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return phoneModels.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "custom", for: indexPath) as! TLObservableObjectViewCell
        cell.phoneModel = phoneModels[indexPath.row]
        return cell
    }
}

extension TLObservableObjectViewController: UITableViewDelegate {
    // 实现必要的代理方法，如果需要的话
}
